package com.example.mq;

import com.example.constant.CommentConstant;
import com.example.entity.OrderInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description: 延时队列生产者
 * @Author: mingtian
 * @CreateDate: 2021/1/26 9:54
 * @Version: 1.0
 */
@RestController
public class DelayQueueProducer {

    /**
     * 打印日志
     */
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private AmqpTemplate amqpTemplate;

    /**
     * 延时队列
     * 使用 arguments.put("x-message-ttl", 5000); 配置 ,SpringBoot 不推荐该方式，推荐使用下面的方式实现延时队列
     *
     * @return
     */
    @GetMapping("/sendDelay")
    public String sendDelayString() {
        String msg = "我是延时消息";
        // 参数1 交换机名称 、参数2路由key  参数3 消息 参数4 延时队列
        amqpTemplate.convertAndSend(CommentConstant.DELAY_EXCHANGE_NAME, CommentConstant.DELAY_ROUTING_KEY, msg);
        logger.info("延时队列投递消息成功");
        return "success";
    }


    /**
     * 发送 字符串方式消息
     *
     * @return
     */
    @GetMapping("/sendDelayString")
    public String sendDelayString(@RequestParam("expireTime") String expireTime) {
        String msg = "我是延时消息";
        // 参数1 交换机名称 、参数2路由key  参数3 消息 参数4 延时队列
        amqpTemplate.convertAndSend(CommentConstant.DELAY_EXCHANGE_NAME, CommentConstant.DELAY_ROUTING_KEY, msg, message -> {
            // 设置消息过期时间 10 m
            message.getMessageProperties().setExpiration(expireTime);
            return message;
        });
        logger.info("延时队列投递消息成功,延时时间:{}ms", expireTime);
        return "success";
    }


    /**
     * 延时队列
     *
     * @return
     */
    @RequestMapping("/sendDelayOrder")
    public String sendDelay(@RequestParam("expireTime") String expireTime) {
        OrderInfo orderInfo = new OrderInfo(System.currentTimeMillis() + "", "华为Mate40Pro+", "模拟订单失效(延时队列)");
        // 参数1 交换机名称 、参数2路由key  参数3 消息
        amqpTemplate.convertAndSend(CommentConstant.DELAY_EXCHANGE_NAME, CommentConstant.DELAY_ROUTING_KEY, orderInfo, message -> {
            // 设置失效时间
            message.getMessageProperties().setExpiration(expireTime);
            return message;
        });
        logger.info("延时队列投递消息成功,延时时间:{}ms", expireTime);
        return "success";
    }
}